//
//  ChivoxTaskQue.m
//  ChivoxEngine
//
//  Created by John on 2018/8/24.
//  Copyright © 2018年 Chivox. All rights reserved.
//

#import "ChivoxTaskQue.h"

#define CHIVOX_TASKQ_STATUS_NONE 0
#define CHIVOX_TASKQ_STATUS_CONNECTED 1
#define CHIVOX_TASKQ_STATUS_STARTED 2
#define CHIVOX_TASKQ_STATUS_STOPED 3

@interface ChivoxTaskQue()
@property (atomic, assign) int _status;
@property (atomic, assign) BOOL _exited;
@property (atomic, assign) BOOL _exiting;
@property (atomic, assign) BOOL _canceling;
@property (nonatomic, strong) NSMutableArray * _taskQue;
@property (nonatomic, strong) ChivoxTask *_curWorking;
@end

@implementation ChivoxTaskQue
{
}

- (id)init {
    if (self = [super init]) {
        self.engineListener = NULL;
        self.innerEngine = NULL;
        self._taskQue = [[NSMutableArray alloc] init];
        self._curWorking = NULL;
        self._exited = NULL;
        self._exiting = NULL;
        self._canceling = NULL;
        self._status = CHIVOX_TASKQ_STATUS_NONE;
    }
    return self;
}

- (ChivoxTask *)topTask {
    @synchronized(self) {
        return [self._taskQue objectAtIndex:0];
    }
}

- (ChivoxTask *)lastTask {
    @synchronized(self) {
        return [self._taskQue lastObject];
    }
}

- (void)appendTask:(ChivoxTask *)task {
    @synchronized(self) {
        [self._taskQue addObject:task];
    }
}

- (void)removeTask:(ChivoxTask *)task {
    @synchronized(self) {
        [self._taskQue removeObject:task];
    }
}

- (void)clearAllTask {
    @synchronized(self) {
        [self._taskQue removeAllObjects];
    }
}

- (void)loop {
    while (true) {
        
        // TODO: 调整为1/60s执行一次
        
        if (self._exited) {
            // TODO: log info
            break;
        }
        
        if (self._curWorking) {
            ChivoxTaskMsg *topMsg = [self._curWorking topMsg];
            if (topMsg) {
                [self _executeTask:self._curWorking Msg:topMsg];
            }
        }
        
        if (self._exiting) {
            continue;
        }
        
        if (self._canceling) {
            continue;
        }
        
        if (self._curWorking == NULL) {
            self._curWorking = [self topTask];
        }
        
    }
}

- (void)_executeTask:(ChivoxTask *)task Msg:(ChivoxTaskMsg *)msg {
    if (!msg) return;
    switch (msg.msgType) {
        case CHIVOX_TASK_MSG_CONNECT:
            return [self _executeTask:task connect:msg];
        case CHIVOX_TASK_MSG_START:
            return [self _executeTask:task Start:msg];
        case CHIVOX_TASK_MSG_FEED:
            return [self _executeTask:task Feed:msg];
        case CHIIVOX_TASK_MSG_STOP:
            return [self _executeTask:task Stop:msg];
        case CHIVOX_TASK_MSG_RESULT:
            return [self _executeTask:task Result:msg];
            break;
        case CHIVOX_TASK_MSG_CANCEL:
            return [self _executeTask:task Cancel:msg];
        case CHIVOX_TASK_MSG_UNINIT:
            return [self _executeTask:task Uninit:msg];
        default:
            return [self _executeTask:task Unknown:msg];
    }
}

- (void)_executeTask:(ChivoxTask *)task connect:(ChivoxTaskMsg *)msg {
    if (self._status != CHIVOX_TASKQ_STATUS_NONE || self._status != CHIVOX_TASKQ_STATUS_CONNECTED) {
       
        return;
    }
    
    //[self.innerEngine connect: ];
    
}

- (void)_executeTask:(ChivoxTask *)task Start:(ChivoxTaskMsg *)msg {
    
}

- (void)_executeTask:(ChivoxTask *)task Feed:(ChivoxTaskMsg *)msg {
    
}

- (void)_executeTask:(ChivoxTask *)task Stop:(ChivoxTaskMsg *)msg {
    
}

- (void)_executeTask:(ChivoxTask *)task Result:(ChivoxTaskMsg *)msg {
    
}

- (void)_executeTask:(ChivoxTask *)task Cancel:(ChivoxTaskMsg *)msg {
    
}

- (void)_executeTask:(ChivoxTask *)task Uninit:(ChivoxTaskMsg *)msg {
    
}

- (void)_executeTask:(ChivoxTask *)task Unknown:(ChivoxTaskMsg *)msg {
    
}


@end
